package com.ruoyi.generator.controller;

import com.ctc.wstx.util.StringUtil;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.generator.domain.GenForm;
import com.ruoyi.generator.domain.GenTable;
import com.ruoyi.generator.domain.GenTableConfig;
import com.ruoyi.generator.service.IGenTableService;
import com.ruoyi.generator.service.impl.FromBuildConfigServiceImpl;
import com.ruoyi.system.service.ISysMenuService;
import oracle.jdbc.proxy.annotation.Post;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 平台菜单处理
 * 优树搭
 */
@RestController
public class YsdSysMenuController
{
    @Autowired
    private ISysMenuService menuService;

    @Autowired
    private IGenTableService genTableService;

    @Autowired
    private FromBuildConfigServiceImpl fromBuildConfigService;

    /**
     * 获取路由信息
     */
    @GetMapping("/getMenus")
    public AjaxResult getMenus()
    {
        Long userId = SecurityUtils.getUserId();
        //结果
        Map<String,Object> result=new HashMap<>();
        //获取菜单树信息
        result.put("menus",menuService.selectMenuTreeByUserId(userId));
        //获取需要生成设计表单的信息
        result.put("needGenFrom",genTableService.getNeedGenFromInfo());
        //获取已经配置了菜单的表信息
        result.put("usedTableInfo",genTableService.getUsedTableInfo());
        return AjaxResult.success(result);
    }

    /**
     * 保存菜单信息
     * @param menus
     * @return
     */
    @PostMapping("saveMenusTree")
    public AjaxResult saveMenusTree(@RequestBody List<SysMenu> menus) throws Exception {
        /** 保存菜单树 **/
        AjaxResult result = genTableService.saveMenusTree(menus);
        Map<String,Object> data=new HashMap<>();
        //获取需要生成设计表单的信息
        data.put("needGenFrom",genTableService.getNeedGenFromInfo());
        result.put(AjaxResult.DATA_TAG,data);
        return result;
    }

    /**
     * 更新菜单路由信息
     * 针对在配置菜单时，添加的空菜单，在后期维护对应的访问路由
     * 并将处理好后的路由地址返回，用于前端刷新页面
     * @param menu
     * @return
     */
    @PostMapping("updateMenusPath")
    public AjaxResult updateMenusPath(@RequestBody SysMenu menu) throws Exception {
        /** 保存菜单树 **/
        return genTableService.updateMenusPath(menu);
    }

    /**
     * 删除菜单
     * @param menuId
     * @return
     */
    @GetMapping("menu/del/{menuId}")
    public AjaxResult delMenu(@PathVariable("menuId") Long menuId) throws Exception {
        /** 保存菜单树 **/
        return genTableService.delMenu(menuId);
    }

    /**
     * 保存表单设计信息
     * @return
     */
    @PostMapping("form/save")
    public AjaxResult genFormSave(@RequestBody List<GenForm> genForms) throws Exception {

        if(genForms==null){
            return AjaxResult.error("表单设计信息不能为空");
        }
        AjaxResult result = AjaxResult.success();
        for (GenForm genForm:genForms){
            if(StringUtils.isEmptyIncludeNull(genForm.getClientType())){
                genForm.setClientType("PC");
            }
            /**
             * 保存表单设计信息
             */
            result = fromBuildConfigService.saveFormInfo(genForm.getTableId(), genForm.getFormBuildKey(), genForm.getClientType(), genForm.getFromBuildConfig());
            if(result.isError()){
                return result;
            }
        }
        return result;
    }


    /**
     * 保存表单设计信息
     * @return
     */
    @PostMapping("page/gener/build/save")
    public AjaxResult savePageGenerBuild(@RequestBody GenForm genForm) throws Exception {
        return genTableService.savePageGenerBuild(genForm);
    }

    /**
     * 保存模块基本配置信息
     * @return
     */
    @PostMapping("page/gener/table/config/save")
    public AjaxResult savePageGenerBuild(@RequestBody GenTableConfig genTableConfig) throws Exception {
        return genTableService.saveTableGenerConfig(genTableConfig);
    }

    /**
     * 根据表名获取对应的配置菜单的信息
     * @param bindTable
     * @returnT
     */
    @GetMapping("menu/bindInfo/{bindTable}")
    public AjaxResult menuBindTableInfo(@PathVariable("bindTable") String bindTable) throws Exception {
        if(StringUtils.isEmptyIncludeNull(bindTable)){
            return AjaxResult.success();
        }
        return AjaxResult.success(menuService.menuBindTableInfo(bindTable));
    }

}
